package com.raymond.thread.manager.annotation;

import com.raymond.thread.manager.bean.ScheduledThreadDefinition;
import org.springframework.context.annotation.Lazy;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 管理定时线程
 * 使用哪个线程池的名称@threadPoolName
 * 当前线程名称@线程名称
 * @author :  raymond
 * @version :  V1.0
 * @date :  2020-09-11 10:32
 */
@Target({ ElementType.TYPE })
@Retention( RetentionPolicy.RUNTIME)
@Lazy
public @interface ManagerScheduledThread {

    ManagerThread managerThread() default @ManagerThread;

    /**
     * 启动后延迟时间
     * @return 延迟时间
     */
    int initialDelay() default 0;

    /**
     * 当策略为AT_FIXED_RATE
     * 延迟时间以上一个任务开始时间开始计算eg：一个线程执行1s,周期为2s，那么它会在0,2,4,6...执行  一个线程执行4s,周期为2s，那么它会在0,4,8,12...执行
     *
     * 当策略为WITH_FIXED_DELAY
     * 延迟时间以上一个任务结束时间开始算。eg：一个线程执行1s,周期为2s,那么它会在0,3,6,9...执行
     * @return 间隔时间
     */
    int period() default 1000;

    /**
     * 定时策略
     * 默认策略为AT_FIXED_RATE
     * @return 定时策略
     */
    ScheduledThreadDefinition.Strategy strategy() default ScheduledThreadDefinition.Strategy.AT_FIXED_RATE;

    /**
     * Spring中的cron表达式
     * 有表达式的情况下优先使用表达式
     * @return 表达式
     */
    String corn() default "";

}
